function P=step_player(G,P,k)
P=feval(P.step_func,G,P,k);
if ~isempty(P.debug),
  disp(sprintf('step=%d,player=%d,pos_ang=%g %g %g %g %g %g',[G.step,k,P.pos,P.ang]));
  disp(sprintf(P.debug,P.Vars));
end;
return

switch lower(P.movement)
case 'random'
    P.pos=P.pos+(rand(1,length(P.pos))-0.5)*P.speed*G.h;
    P.ang=P.ang+(rand(1,length(P.ang))-0.5)*P.ang_speed*G.h;
    P=feval(P.calc_Vars_func,G,P,k);
case 'straight'
    P.pos=P.pos+def_delta_pos_func(G,P,k);
    P=feval(P.calc_Vars_func,G,P,k);
case 'simple'
    P.ang=P.ang+feval(P.delta_ang_func,G,P,k);
    P.pos=P.pos+def_delta_pos_func(G,P,k);
    P=feval(P.calc_Vars_func,G,P,k);
case 'delta'
    P.ang=P.ang+feval(P.delta_ang_func,G,P,k);
    P.pos=P.pos+feval(P.delta_pos_func,G,P,k);
    P=feval(P.calc_Vars_func,G,P,k);
case 't_func'
    tmp=feval(P.t_func,G.t);
    m=length(tmp);
    d=length(P.pos);
    P.pos=tmp(1:d);
    if m>d,
        P.ang=tmp(d+1:m);
    end;
    P=feval(P.calc_Vars_func,G,P,k);
case 'step_func'
    
case 'ode_func'
    tspan=[G.t,G.t+G.h];
    y0=P.X;
    [t,y]=ode23(P.ode_func,tspan,y0,[],G,P,k);
    P.trace=y;
    P.X=y(end,:);
    P=feval(P.calc_pos_ang_func,G,P,k);
otherwise
    
end
